package com.jhy.guavacase.utilites;

import com.google.common.base.Preconditions;
import org.junit.jupiter.api.Test;

import java.util.ArrayList;

/**
 * @author jhy
 * @ClassName PredictionsCase.java
 * @Description Guava中断言Preconditions的用法
 * @createTime 2022年02月22日 12:38:00
 */
public class PreconditionsCase {

    //1.非空检查
    @Test
    public void checkNotNull(){

        //(1)参数为null,抛出空指针异常NPE
        try {
            Preconditions.checkNotNull(null);
        }catch (NullPointerException e){
            System.out.println("NPE异常");
        }

        //(2)自定义异常信息
        try {
            Preconditions.checkNotNull(null,"自定义异常message，参数不能为null");
        }catch (NullPointerException e){
            System.out.println("NPE异常");
            System.out.println("异常信息为：" + e.getMessage());
        }

        //(3)格式化异常信息
        try {
            Preconditions.checkNotNull(null,"格式化异常信息，%s",2222);
        }catch (NullPointerException e){
            System.out.println("NPE异常");
            System.out.println("异常信息为：" + e.getMessage());
        }
    }

    //2.参数检查
    // 就是传入一个表达式，如果该表达式为true，则断言通过；如果为false，则抛出非法参数异常IllegalArgumentException
    //也可以自定义异常信息，格式化异常信息等
    @Test
    public void checkArguments(){
        try {
            Preconditions.checkArgument(1==2);
        }catch (IllegalArgumentException e){
            System.out.println("非法参数异常" + e);
        }
    }

    //3.状态检查
    //也是传入一个表达式，如果该表达式为true，则断言通过；如果为false，则抛出状态异常
    //与checkArgument()区别主要是语义上，checkState()多用在检查线程状态或者各种状态机中
    @Test
    public void checkState() throws InterruptedException {
        try {
            Thread thread = new Thread();
            thread.start();
            Thread.sleep(1000);
            //线程终止，终止状态，断言通过
            //Preconditions.checkState(thread.getState().equals(Thread.State.TERMINATED));
            //其他状态，断言失败
            Preconditions.checkState(thread.getState().equals(Thread.State.RUNNABLE));
        }catch (IllegalStateException e){
            System.out.println("非法状态异常：" + e);
        }
    }

    //下标检查
    @Test
    public void checkElementIndex(){

        try {
            ArrayList<Integer> list = new ArrayList<>();
            Preconditions.checkElementIndex(10,list.size());
        }catch (IndexOutOfBoundsException e){
            System.out.println("下标越界异常：" + e);
        }
    }



}
